from flask import jsonify, request
import logging
import traceback

def setup_error_handlers(app):
    """设置错误处理器"""
    
    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            'error': 'Bad Request',
            'message': '请求参数错误',
            'status_code': 400
        }), 400
    
    @app.errorhandler(401)
    def unauthorized(error):
        return jsonify({
            'error': 'Unauthorized',
            'message': '未授权访问',
            'status_code': 401
        }), 401
    
    @app.errorhandler(403)
    def forbidden(error):
        return jsonify({
            'error': 'Forbidden',
            'message': '禁止访问',
            'status_code': 403
        }), 403
    
    @app.errorhandler(404)
    def not_found(error):
        return jsonify({
            'error': 'Not Found',
            'message': '请求的资源不存在',
            'status_code': 404
        }), 404
    
    @app.errorhandler(413)
    def request_entity_too_large(error):
        return jsonify({
            'error': 'Request Entity Too Large',
            'message': '上传文件过大',
            'status_code': 413
        }), 413
    
    @app.errorhandler(429)
    def rate_limit_exceeded(error):
        return jsonify({
            'error': 'Rate Limit Exceeded',
            'message': '请求频率过高，请稍后再试',
            'status_code': 429
        }), 429
    
    @app.errorhandler(500)
    def internal_server_error(error):
        logging.error(f"Internal Server Error: {error}")
        logging.error(f"Request: {request.method} {request.url}")
        logging.error(f"Traceback: {traceback.format_exc()}")
        
        return jsonify({
            'error': 'Internal Server Error',
            'message': '服务器内部错误',
            'status_code': 500
        }), 500
    
    @app.errorhandler(502)
    def bad_gateway(error):
        return jsonify({
            'error': 'Bad Gateway',
            'message': '上游服务错误',
            'status_code': 502
        }), 502
    
    @app.errorhandler(503)
    def service_unavailable(error):
        return jsonify({
            'error': 'Service Unavailable',
            'message': '服务暂时不可用',
            'status_code': 503
        }), 503
    
    @app.errorhandler(Exception)
    def handle_exception(error):
        """处理未捕获的异常"""
        logging.error(f"Unhandled Exception: {error}")
        logging.error(f"Request: {request.method} {request.url}")
        logging.error(f"Traceback: {traceback.format_exc()}")
        
        return jsonify({
            'error': 'Internal Server Error',
            'message': '服务器内部错误',
            'status_code': 500
        }), 500

class APIError(Exception):
    """自定义API错误"""
    
    def __init__(self, message: str, status_code: int = 400, error_code: str = None):
        super().__init__(message)
        self.message = message
        self.status_code = status_code
        self.error_code = error_code
    
    def to_dict(self):
        return {
            'error': self.error_code or 'API Error',
            'message': self.message,
            'status_code': self.status_code
        }
